#pragma once
#include <iostream>
#include <string>
#include <vector>
#include <ctemplate/template.h>
#include "../comm/log.hpp"
#include "../comm/util.hpp"
#include "oj_model.hpp"

namespace NS_View
{
    using namespace NS_Log;
    using namespace NS_Util;
    using namespace NS_Model;
    using namespace ctemplate;

    const std::string template_path = "./template_html/";

    class View
    {
    private:

    public:
        View()
        {}

        // struct Question
        // {
        //     std::string _number;     // 题目编号
        //     std::string _title;      // 题目标题
        //     std::string _desc;       // 题目描述
        //     std::string _difficulty; // 题目难度 简单 中等 困难
        //
        //     int _cpu_limit;          // 题目的时间要求
        //     int _mem_limit;          // 题目的空间要求
        //
        //     std::string _header;     // 题目的预设代码
        //     std::string _tail;       // 题目的测试用例
        // };
        // 题库列表只需显示题目编号、题目标题、题目难度
        void ExpandAllQuestionsHtml(const std::vector<Question> questions, std::string* html)
        {
            std::string src_html = template_path + "all_questions.html"; // 路径
            // 形成数据字典
            TemplateDictionary root("all_questions");
            for (const auto& q : questions)
            {
                TemplateDictionary* sub = root.AddSectionDictionary("questions_list");
                sub->SetValue("number", q._number);
                sub->SetValue("title", q._title);
                sub->SetValue("difficulty", q._difficulty);
            }

            // 获取被渲染的网页
            Template* tpl = Template::GetTemplate(src_html, DO_NOT_STRIP);

            tpl->Expand(html, &root);
        }

        // 题目编辑
        void ExpandOneQuestionHtml(Question& question, std::string* html)
        {
            // 路径
            std::string src_html = template_path + "one_question.html";
            // 形成数据字典
            TemplateDictionary root("one_question");
            root.SetValue("number", question._number);
            root.SetValue("title", question._title);
            root.SetValue("difficulty", question._difficulty);
            root.SetValue("desc", question._desc);
            root.SetValue("header_code", question._header);

            // 获取被渲染的网页
            Template* tpl = Template::GetTemplate(src_html, DO_NOT_STRIP);
            //
            tpl->Expand(html, &root);
        }

        ~View()
        {}

    };

}
